#*- coding: UTF-8 -*-
import thread
import threading
from _Outils.Job import *
from _Outils.Vecteur import *
from ElementPlateforme import *
from MiniJeux.PartieMiniJeu import *
import time

class Gravite:
    def __init__(self, plateforme):
        self.plateforme = plateforme
        
        self.jobGravite = Job(0.05, self.affect)
        
        self.lastFeu = 0
        
        self.lock = threading.Lock()
       
    def demarerGravite(self): 
        self.jobGravite.start()
        self.debut = time.time()
        print self.debut
        
    def manageTime(self):
        if time.time() - self.debut > self.plateforme.tempsFin:
            print "WALLLAAHHHHHHH"
            for team in self.plateforme.equipes:
                teamScore = team.getScore()
                for joueur in team.listeJoueurs:
                    joueur.score += teamScore
            self.jobGravite.stop()
            self.plateforme.jobFeu.stop()
            self.plateforme.actif = False
            self.plateforme.termine = True
        else:
            self.plateforme.elapsedTime = time.time() - self.debut
        
    def affect(self):
        self.manageTime()
        for joueur in self.plateforme.joueurs.values():
            self.gravityAffect(joueur)
        for el in self.plateforme.elemVariables:
            if(isinstance(el, Feu)):
                self.gravityAffect(el)
        self.plateforme.verifierCollisionsVariables()
        self.powManager()
        
    def powManager(self):
        for e in self.plateforme.elemStatiques:
            if isinstance(e, Pow):
                if not e.active:
                    i = random.randint(0,400)
                    if i == 1:
                        e.active = True
                        print "pow active"
                
    def gravityAffect(self, joueur):  
        if(joueur.vecteur.y > -0.5):
            joueur.vecteur.y -= 0.05

        joueur.vecteur.x = 0
        if joueur.haut:
            self.plateforme.saut(joueur)
        if joueur.droite:
            joueur.vecteur.x += joueur.vitesse
        if joueur.gauche:
            
            joueur.vecteur.x += -joueur.vitesse
         
        #print '---', joueur.vecteur

        plateformeFautive = self.plateforme.joueurCollidesPlateforme(joueur, joueur.vecteur)
        if plateformeFautive == None:
            joueur.pos.translate(joueur.vecteur)
        else:
            p = plateformeFautive
            if joueur.pos.x >= p.pos.x + p.largeur:
                joueur.pos.x = p.pos.x + p.largeur
                joueur.vecteur.x = 0
            elif joueur.pos.x + joueur.largeur <= p.pos.x:
                joueur.pos.x = p.pos.x - joueur.largeur;
                joueur.vecteur.x = 0
            elif joueur.pos.y > p.pos.y:
                joueur.pos.y = p.pos.y + p.hauteur
                joueur.vecteur.y = 0
            elif joueur.pos.y < p.pos.y:
                #Ouch la tete!
                if(isinstance(joueur, JoueurMiniJeu)):
                    if not isinstance(p, Pow):
                        print "un joueur se cogne la tete"
                        jor = joueur.toRectangle();
                        jor.y += p.hauteur + 0.2
                        for j in self.plateforme.joueurs.values():
                            if j is not joueur and j.equipe is not joueur.equipe:
                                jr = j.toRectangle();
                                if jr.touche(jor):
                                    if j.score>0:
                                        joueur.score += 1
                                    self.plateforme.tuer(j)
                        for el in self.plateforme.elemVariables:
                            if(isinstance(el, Feu)):
                                er = el.toRectangle();
                                if er.touche(jor):
                                    if el in self.plateforme.elemVariables:
                                        self.plateforme.elemVariables.remove(el)
                    else:
                        p.explode(joueur,self.plateforme)
                joueur.pos.y = p.pos.y - joueur.hauteur
                joueur.vecteur.y = 0

            joueur.pos.x += joueur.vecteur.x
            joueur.pos.y += joueur.vecteur.y
            
        #print joueur.pos
        
        #(occasionnal bugs)
        if joueur.pos.y <= 0:
            if(isinstance(joueur, Feu)):
                if joueur in self.plateforme.elemVariables:
                    self.plateforme.elemVariables.remove(joueur)
            else:
                joueur.score -= 1
                if joueur.score < 0:
                    joueur.score = 0
                joueur.pos = joueur.startPos.copy()
        elif joueur.pos.y + joueur.hauteur > self.plateforme.hauteur-0.5:
            joueur.pos.y = self.plateforme.hauteur-1-joueur.hauteur
        
        if joueur.pos.x + joueur.largeur < 0:
            joueur.pos.x = self.plateforme.largeur-1
            joueur.pos.y = joueur.pos.y + 0.1
        elif joueur.pos.x > self.plateforme.largeur:
            joueur.pos.x = 0 - joueur.largeur + 1
            joueur.pos.y = joueur.pos.y + 0.1